using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{
        public CaixaVO getCaixa(int? idCaixa)
        {
            return getCaixa(idCaixa, null);
        }

        public CaixaVO getCaixa(int? idCaixa, string caixa)
        {
            return getCaixa(idCaixa, caixa, null);
        }

        public CaixaVO getCaixa(int? idCaixa, string caixa, int? idFilial)
        {
            return getCaixa(idCaixa, caixa, idFilial, null);
        }

        public CaixaVO getCaixa(int? idCaixa, string caixa, int? idFilial, int? idCaixatipo)
        {
            return getCaixa(idCaixa, caixa, idFilial, idCaixatipo, null);
        }

        public CaixaVO getCaixa(int? idCaixa, string caixa, int? idFilial, int? idCaixatipo, char? situacao)
		{
			CaixaVO caixaVO = null;
			List<CaixaVO> listCaixaVOs = getCaixas(idCaixa, caixa, null, null, null);
			if (listCaixaVOs != null && listCaixaVOs.Count > 0)
			{
				caixaVO = listCaixaVOs[0];
			}
			return caixaVO;
		}

		public List<CaixaVO> getCaixas()
		{
			return getCaixas(null, null, null, null, null);
		}

		public List<CaixaVO> getCaixas(int? idCaixa)
		{
			return getCaixas(idCaixa, null, null, null, null);
		}

		public List<CaixaVO> getCaixas(int? idCaixa, string caixa)
		{
			return getCaixas(idCaixa, caixa, null, null, null);
		}

		public List<CaixaVO> getCaixas(int? idCaixa, string caixa, int? idFilial, int? idCaixatipo, char? situacao)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT cxa.idCaixa as cxa_idCaixa, cxa.caixa as cxa_caixa, cxa.idFilial as cxa_idFilial, fil.filial as fil_filial, cxa.idCaixatipo as cxa_idCaixatipo, cxt.caixaTipo as cxt_caixaTipo, cxa.saldo as cxa_saldo, cxa.situacao as cxa_situacao, cxa.cadastro as cxa_cadastro, cxa.cadastradoPor as cxa_cadastradoPor, cxa.edicao as cxa_edicao, cxa.editadoPor as cxa_editadoPor  ");
			query.AppendLine("FROM caixa as cxa LEFT OUTER JOIN filial as fil on cxa.idFilial=fil.idFilial  LEFT OUTER JOIN caixatipo as cxt on cxa.idCaixatipo=cxt.idCaixaTipo  ");
			if (idCaixa != null)
			{
				query.AppendLine(where + "cxa.idCaixa=@idCaixa ");
				where = "AND ";
			}
			if (caixa != null)
			{
				query.AppendLine(where + "cxa.caixa LIKE @caixa ");
				where = "AND ";
			}
			if (idFilial != null)
			{
				query.AppendLine(where + "cxa.idFilial=@idFilial ");
				where = "AND ";
			}
			if (idCaixatipo != null)
			{
				query.AppendLine(where + "cxa.idCaixatipo=@idCaixatipo ");
				where = "AND ";
			}
			if (situacao != null)
			{
				query.AppendLine(where + "cxa.situacao=@situacao ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY cxa.caixa ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idCaixa!= null) cmd.Parameters.Add(getParameter(cmd, "@idCaixa", idCaixa));
			if (caixa!= null) cmd.Parameters.Add(getParameter(cmd, "@caixa", "%"+caixa+"%"));
			if (idFilial!= null) cmd.Parameters.Add(getParameter(cmd, "@idFilial", idFilial));
			if (idCaixatipo!= null) cmd.Parameters.Add(getParameter(cmd, "@idCaixatipo", idCaixatipo));
			if (situacao!= null) cmd.Parameters.Add(getParameter(cmd, "@situacao", situacao));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<CaixaVO> listCaixa = new List<CaixaVO>();

				while (reader.Read())
				{
					CaixaVO caixaVO = CaixaVO.CreateVO();
					caixaVO.idCaixa = reader.GetInt32(reader.GetOrdinal("cxa_idCaixa"));
					caixaVO.caixa = reader.GetString(reader.GetOrdinal("cxa_caixa"));
					caixaVO.idFilial = reader.GetInt32(reader.GetOrdinal("cxa_idFilial"));
					if (!reader.IsDBNull(reader.GetOrdinal("fil_filial")))
						caixaVO.idFilialVO.filial = reader.GetString(reader.GetOrdinal("fil_filial"));
					caixaVO.idCaixatipo = reader.GetInt32(reader.GetOrdinal("cxa_idCaixatipo"));
					if (!reader.IsDBNull(reader.GetOrdinal("cxt_caixaTipo")))
						caixaVO.idCaixatipoVO.caixaTipo = reader.GetString(reader.GetOrdinal("cxt_caixaTipo"));
					caixaVO.saldo = reader.GetDecimal(reader.GetOrdinal("cxa_saldo"));
					caixaVO.situacao = reader.GetChar(reader.GetOrdinal("cxa_situacao"));
					caixaVO.cadastro = reader.GetDateTime(reader.GetOrdinal("cxa_cadastro"));
					caixaVO.cadastradoPor = reader.GetString(reader.GetOrdinal("cxa_cadastradoPor"));
					caixaVO.edicao = reader.GetDateTime(reader.GetOrdinal("cxa_edicao"));
					caixaVO.editadoPor = reader.GetString(reader.GetOrdinal("cxa_editadoPor"));


					listCaixa.Add(caixaVO);
				}
				reader.Close();
				return listCaixa;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setCaixa(CaixaVO caixaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE caixa ");
			query.AppendLine("SET caixa=@caixa, idFilial=@idFilial, idCaixatipo=@idCaixatipo, saldo=@saldo, situacao=@situacao,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idCaixa=@idCaixa ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixa", caixaVO.idCaixa));
			cmd.Parameters.Add(getParameter(cmd, "@caixa", caixaVO.caixa));
			cmd.Parameters.Add(getParameter(cmd, "@idFilial", caixaVO.idFilial));
			cmd.Parameters.Add(getParameter(cmd, "@idCaixatipo", caixaVO.idCaixatipo));
			cmd.Parameters.Add(getParameter(cmd, "@saldo", caixaVO.saldo));
			cmd.Parameters.Add(getParameter(cmd, "@situacao", caixaVO.situacao));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", caixaVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", caixaVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", caixaVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", caixaVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newCaixa(CaixaVO caixaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO caixa ");
			query.AppendLine("  ( caixa, idFilial, idCaixatipo, saldo, situacao, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @caixa, @idFilial, @idCaixatipo, @saldo, @situacao, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@caixa", caixaVO.caixa));
			cmd.Parameters.Add(getParameter(cmd, "@idFilial", caixaVO.idFilial));
			cmd.Parameters.Add(getParameter(cmd, "@idCaixatipo", caixaVO.idCaixatipo));
			cmd.Parameters.Add(getParameter(cmd, "@saldo", caixaVO.saldo));
			cmd.Parameters.Add(getParameter(cmd, "@situacao", caixaVO.situacao));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", caixaVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", caixaVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", caixaVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", caixaVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('caixa') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delCaixa(CaixaVO caixaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM caixa ");
			query.AppendLine("WHERE idCaixa=@idCaixa ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixa", caixaVO.idCaixa));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountCaixaxIdFilial(int? idFilial)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idFilial) as ocorrencias FROM caixa WHERE IdFilial=@IdFilial ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdFilial", idFilial));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountCaixaxIdCaixatipo(int? idCaixatipo)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idCaixatipo) as ocorrencias FROM caixa WHERE IdCaixatipo=@IdCaixatipo ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdCaixatipo", idCaixatipo));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
